#pragma once

#include "Tests.h"
#include "TextStreamFake.h"
#include "WorkModeMenuText.h"
#include "WorkModeMenuTextLocalizationFake.h"
#include "WorkModeReceiverFake.h"

namespace TestWorkModeMenuText
{

/////////////////////////////////////////////////////////////////////////////////////////////////////

void RunAllTests ();

////////////////////////////////////////////////////////////////////////////////////////////////

class TestBase
{
public:
	std::string SuiteIdentity ();
	virtual std::string TestIdentity () = 0;
protected:
	TestBase ();
	virtual ~TestBase ();
	void RunSingle ();
private:
	void CheckOutput ();
protected:
	TextStreamFakePtr textStream;
	WorkModeReceiverFakePtr receiver;
	std::string expectedOutput;
};

/////////////////////////////////////////////////////////////////////////////////////////////////////

class TestInvalidSelection
: public TestBase
{
public:
	static void Run ();
	virtual std::string TestIdentity ();
private:
	TestInvalidSelection ();
};

/////////////////////////////////////////////////////////////////////////////////////////////////////

class TestValidSelection
: public TestBase
{
public:
	static void Run ();
	virtual std::string TestIdentity ();
private:
	TestValidSelection ();
};

/////////////////////////////////////////////////////////////////////////////////////////////////////

class TestMenuItems
: public TestBase
{
public:
	static void Run ();
	virtual std::string TestIdentity ();
private:
	TestMenuItems ( std::string receiverFunctionInvoked, char menuSelection );
	virtual ~TestMenuItems ();
private:
	std::string receiverFunctionInvoked;
	char menuSelection; 
};

/////////////////////////////////////////////////////////////////////////////////////////////////////

}; // namespace TestWorkModeMenuText
